﻿using System;
using System.Windows;
//using SaludSA.CeroTramites.Common;
using Kaesoft.Hospedaje.Entities;
using Kaesoft.Hospedaje.Proxy;
using Kaesoft.Hospedaje.Proxy.AdministracionReference;
using Kaesoft.Hospedaje.Proxy.ServicioClienteReference;
using System.Collections.Generic;

namespace Kaesoft.Hospedaje.Common
{
    public class LoginViewModel : ViewModelBase
    {
        #region Variables
        /// <summary>
        /// Identificador para el tipo de conexion
        /// </summary>
        private enum TipoConexion
        {
            Lan,
            Dmz
        }

        private bool _activoLAN;
        private bool _activoDMZ;
        private string _usuario;
        private string _clave;
        private RelayCommand _conectarDMZ;
        private bool _credencialInvalida;
        private Usuario _usuarioAutenticado;
        private VentanaClavesView _ventanaClave;
        private VentanaClavesViewModel _ventanaClaveModelo;
        #endregion

        #region Propiedades
        /// <summary>
        /// View Model de la ventana de cambio de clave
        /// </summary>
        public VentanaClavesViewModel VentanaClaveModelo
        {
            get { return _ventanaClaveModelo; }
            set
            {
                if (_ventanaClaveModelo != value)
                {
                    _ventanaClaveModelo = value;
                    OnPropertyChanged("VentanaClaveModelo");
                }
            }
        }

        /// <summary>
        /// Vista de la ventana de cambio de clave
        /// </summary>
        public VentanaClavesView VentanaClaveVista
        {
            get { return _ventanaClave; }
            set
            {
                if (_ventanaClave != value)
                {
                    _ventanaClave = value;
                    OnPropertyChanged("VentanaClaveVista");
                }
            }
        }

        public string NombreUsuario { get { return _usuarioAutenticado == null ? "" : _usuarioAutenticado.nombre; } }

        /// <summary>
        /// Usuario LAN o DMZ
        /// </summary>
        public bool ActivoLAN
        {
            get { return _activoLAN; }
            set
            {
                if (_activoLAN != value)
                {
                    _activoLAN = value;
                    OnPropertyChanged("ActivoLAN");
                }
            }
        }

        /// <summary>
        /// Usuario DMZ o LAN
        /// </summary>
        public bool ActivoDMZ
        {
            get { return _activoDMZ; }
            set
            {
                if (_activoDMZ != value)
                {
                    _activoDMZ = value;
                    OnPropertyChanged("ActivoDMZ");
                }
            }
        }

        /// <summary>
        /// Nombre de usuario DMZ
        /// </summary>
        public string Usuario
        {
            get { return _usuario; }
            set
            {
                if (_usuario != value)
                {
                    _usuario = value;
                    OnPropertyChanged("Usuario");
                }
            }
        }

        /// <summary>
        /// Contraseña del usuario DMZ
        /// </summary>
        public string Clave
        {
            get { return _clave; }
            set
            {
                if (_clave != value)
                {
                    _clave = value;
                    OnPropertyChanged("Clave");
                }
            }
        }

        /// <summary>
        /// Comando para conectar un usuario externo
        /// </summary>
        public RelayCommand ConectarDMZ
        {
            get { return _conectarDMZ ?? (_conectarDMZ = new RelayCommand(ConectarUsuarioDMZ)); }
        }

        /// <summary>
        /// Mostrar el label de credenciales inválidas
        /// </summary>
        public bool CredencialInvalida
        {
            get { return _credencialInvalida; }
            set
            {
                if (_credencialInvalida != value)
                {
                    _credencialInvalida = value;
                    OnPropertyChanged("CredencialInvalida");
                }
            }
        }
        #endregion

        #region Eventos
        public event EventHandler UsuarioAutenticado;
        #endregion

        #region Constructor
        /// <summary>
        /// Crea una instancia de LoginViewModel
        /// </summary>
        public LoginViewModel()
        {
            MessageBoxWindow = new MessageWindowView();

            //Autenticar usuario
            ActivoLAN = false;
            ActivoDMZ = true;
            CredencialInvalida = false;
            VentanaClaveVista = new VentanaClavesView();
            VentanaClaveModelo = new VentanaClavesViewModel();
            //AutenticarUsuario();
            WcfProxyInvoker.ErrorAutenticacion += new EventHandler(WcfProxyInvoker_ErrorAutenticacion);
        }

        void WcfProxyInvoker_ErrorAutenticacion(object sender, EventArgs e)
        {
            MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel((sender as AuthenticationException).Mensaje,
                                                                                           MessageBoxButtons.Ok, MessageBoxIcon.Error);
            MessageBoxWindow.DataContext = msgWindowViewModel;
            msgWindowViewModel.Closing += (msgsender, ev) =>
            {
                MessageBoxWindow.Close();
                Procesando = false;
            };
            MessageBoxWindow.ShowDialog();
            return;
        }
        #endregion

        #region Metodos Publicos
        #endregion

        #region Metodos Privados

        /// <summary>
        /// Ejecutar el comando ConectarDMZ
        /// </summary>
        /// <param name="parameter">Parámetro del comando (null)</param>
        private void ConectarUsuarioDMZ(object parameter)
        {
            WcfProxyInvoker.Clave = Clave;
            WcfProxyInvoker.Usuario = Usuario;
            
            Procesando = true;
            ProxyAdministracion.ValidarCredencialesAsync(Usuario, Clave, ValidarCredencialesCompleted);
        }

        /// <summary>
        /// Completar llamada async al metodo ValidarCredencialesAsync
        /// </summary>
        /// <param name="sender">Objeto fuente</param>
        /// <param name="e">Argumentos del evento</param>
        private void ValidarCredencialesCompleted(ValidarCredencialesCompletedEventArgs e)
        {
            if (e.Error == null)
            {
                _usuarioAutenticado = e.Result;
                if (_usuarioAutenticado == null)
                {
                    MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel("Credenciales no válidas.",
                                                                                           MessageBoxButtons.Ok, MessageBoxIcon.Information);
                    MessageBoxWindow.DataContext = msgWindowViewModel;
                    msgWindowViewModel.Closing += (msgsender, ev) =>
                    {
                        Procesando = false;
                        MessageBoxWindow.Close();
                    };
                    MessageBoxWindow.ShowDialog();
                    return;
                }
                else if (_usuarioAutenticado.cabiarClave)
                {
                    VentanaClaveVista.DataContext = VentanaClaveModelo;
                    VentanaClaveModelo.Autenticado = _usuarioAutenticado;
                    VentanaClaveModelo.PasswordChanged += VentanaClaveModelo_PasswordChanged;
                    VentanaClaveModelo.WindowClosing += VentanaClaveModelo_WindowClosing;
                    VentanaClaveVista.Show();
                }
                else
                    InicializaUsuarioAutenticado();

            }
            else
            {
                if (string.IsNullOrEmpty(Usuario))
                {
                    MessageWindowViewModel msgWindowViewModel = new MessageWindowViewModel("Autenticación fallida, por favor vuelva a intentarlo.",
                                                                                           MessageBoxButtons.Ok, MessageBoxIcon.Information);
                    MessageBoxWindow.DataContext = msgWindowViewModel;
                    msgWindowViewModel.Closing += (msgsender, ev) =>
                    {
                        MessageBoxWindow.Close();
                    };
                    MessageBoxWindow.ShowDialog();
                }
                else
                    CredencialInvalida = true;
            }
        }

        /// <summary>
        /// Función que se ejecuta al detectar el evento WindowClosing
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void VentanaClaveModelo_WindowClosing(object sender, EventArgs e)
        {
            Procesando = false;
        }

        /// <summary>
        /// Función que se ejecuta al detectar el evento PasswordChanged
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void VentanaClaveModelo_PasswordChanged(object sender, EventArgs e)
        {
            InicializaUsuarioAutenticado();
        }

        /// <summary>
        /// Setea en cache el usuario autenticado y le da acceso al sistema
        /// </summary>
        private void InicializaUsuarioAutenticado()
        {
            WcfProxyInvoker.UsuarioAutenticado = true;

            //Conecto el usuario al sistema y grabo caché
            Caching.Instancia.UsuarioSistema = _usuarioAutenticado;

            //Muestro el nombre del usuario
            OnPropertyChanged("NombreUsuario");

            //Notifico que se ha autenticado
            if (UsuarioAutenticado != null)
                UsuarioAutenticado(null, new EventArgs());

            Caching.Instancia.CargarDiccionarios();
        }
        #endregion
    }
}